#ifndef LONGKEY_BASE_ATLASSERT_H_
#define LONGKEY_BASE_ATLASSERT_H_

#include <tchar.h>

#ifdef _DEBUG
#ifndef DEBUG
#error DEBUG and _DEBUG must be in sync
#endif
#endif

	enum ReportType {
		R_INFO = 1,   // Not an error, used for accumulating statistics.
		R_WARNING,    // May or may not be an error.
		R_ERROR,      // Definitely an error.
		R_FATAL       // halt program == ASSERT for release mode.
	};

	enum DebugReportKind {
		DEBUGREPORT_NONE   = 0,
		DEBUGREPORT_ASSERT = 1,
		DEBUGREPORT_REPORT = 2,
		DEBUGREPORT_ABORT  = 3
	};

#ifdef DEBUG
	extern "C" bool DebugReport(unsigned int id,
		ReportType type,
		const char* expr,
		const TCHAR* message,
		const char* filename,
		int linenumber,
		DebugReportKind debug_report_kind);
#ifndef ATLASSERT
#define ATLASSERT(expr)                         \
	do {                                          \
	if (!(expr)) {                              \
	DebugReport(0,                            \
	R_FATAL,               \
#expr,                        \
	_T("ATL assertion"),          \
	__FILE__,                     \
	__LINE__,                     \
	DEBUGREPORT_ASSERT);   \
	}                                           \
	} while (0)
#endif
#else
#ifndef ATLASSERT
#define ATLASSERT(expr) ((void)0)
#endif
#endif

#endif